package com.munhrasoft.dinamica.business.logic;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.munhrasoft.dinamica.business.entities.Cliente;
import com.munhrasoft.dinamica.business.entities.Processo;
import com.munhrasoft.dinamica.business.entities.ProcessoCheckList;

@Stateless
public class ProcessoEJB {

	@PersistenceContext(unitName = "dinamicaPU")
	private EntityManager em;

	@SuppressWarnings("unchecked")
	public List<Processo> findProcessoByCliente(Cliente cliente) {
		Query query = em.createNamedQuery("findByCliente");
		query.setParameter("cliente", cliente);
		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Processo> findProcessoByTitulo(String titulo) {
		Query query = em.createNamedQuery("findByProcessTitulo");
		query.setParameter("titulo", titulo);
		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Processo> findProcessoById(Long id) {
		Query query = em.createNamedQuery("findByProcessId");
		query.setParameter("id", id);
		return query.getResultList();
	}

	public Processo createProcesso(Processo processo) {
		em.persist(processo);
		return processo;
	}

	public Processo updateProcesso(Processo processo) {
		return em.merge(processo);
	}

	public void removeProcesso(Processo processo) {
		// Remover todas as lines tem que ver como isso funciona, tem que ver
		// como vai
		// fazer cascata de remocao
		em.remove(em.merge(processo));
	}

	/**
	 * Vamos usar este metodo para ordenar os passos para que a ordem saia
	 * correta no relatorio
	 * 
	 * @param processo
	 */

	public void ordenaPassosPorGrupo(Processo processo) {
		Collections.sort(processo.getProcessoChkLine(),
				new Comparator<ProcessoCheckList>() {
					public int compare(ProcessoCheckList pchecklist1,
							ProcessoCheckList pchecklist2) {
						int resultado = 0;
						if (pchecklist1.getOpcional()) {
							resultado = pchecklist1
									.getGrupo()
									.compareToIgnoreCase(pchecklist2.getGrupo());
							resultado = resultado + 1;
						} else {
							resultado = pchecklist1
									.getGrupo()
									.compareToIgnoreCase(pchecklist2.getGrupo());
						}

						return resultado;
					}

				});
	}
}
